/*
 * Asteroide.cpp
 *
 *  Created on: Apr 5, 2012
 *      Author: gonzalo-Ramiro
 */

#include "Asteroide.h"
#include "../common/lib/SDL_rotozoom.h"
#include "../common/utils/SurfaceUtils.h"

Asteroide::Asteroide() {
}

Asteroide::Asteroide(DTOAsteroide* dto) :
		WidgetMovimiento(0, 0, NULL) {

	//Rota y guarda imagen rotada.
	Uint32 colorkey;

	surfaceReference = loadSurface(dto->tipo->imagen);
	if(surfaceReference != NULL){
		surfaceReference = SurfaceUtils::resizeSurface(dto->tipo->ancho,dto->tipo->alto,surfaceReference);
		colorkey = SDL_MapRGB( surfaceReference->format, 255, 255, 255 );
		SDL_SetColorKey( surfaceReference, SDL_SRCCOLORKEY, colorkey );
	}

	surfaceReference = SurfaceUtils::resizeSurface(dto->tipo->ancho,dto->tipo->alto,surfaceReference);

	colorkey = SDL_MapRGB( surfaceReference->format, 255, 255, 255 );
	SDL_SetColorKey( surfaceReference, SDL_SRCCOLORKEY, colorkey );

	parcel.height = surfaceReference->h;
	parcel.width = surfaceReference->w;
	parcel.posX = dto->x;
	parcel.posY = dto->y;

	this->angle = dto->tipo->rotacion;
	this->direccion = dto->direccion;
	this->velocidad = dto->velocidad;
	this->tipo = new TipoAsteroide(dto->tipo);
}

DTOAsteroide* Asteroide::getDTO() {
	return new DTOAsteroide(tipo->getDTO(),parcel.posX,parcel.posY,direccion,velocidad);
}

void Asteroide::setParent(Widget* widget){
	//TODO posible memory leak
	this->parent = widget;
}

void Asteroide::handleEvent(Event event) {
	//NO hacen nada los elementos de juego aún;
}

Asteroide::Asteroide(TipoAsteroide* tipo,int x,int y,int direccion,
		int velocidad, Widget* parent,std::string imagePath) :
		WidgetMovimiento(x, y, parent) {

	//Rota y guarda imagen rotada.
	Uint32 colorkey;

	surfaceReference = loadSurface(imagePath);
	colorkey = SDL_MapRGB( surfaceReference->format, 255, 255, 255);
	SDL_SetColorKey( surfaceReference, SDL_SRCCOLORKEY, colorkey );

	parcel.height = surfaceReference->h;
	parcel.width = surfaceReference->w;
	parcel.posX = x;
	parcel.posY = y;

	this->direccion = direccion;
	this->velocidad = velocidad;
	this->tipo->imagen = imagePath;
}

void Asteroide::resolve() {
	if(!timer.is_started()){
		timer.start();
	}

	float angleInRadians = direccion * (M_PI / 180.0);
	float secsPerFrame = (timer.get_ticks() / 1000.0);

	nextX = velocidad * cos(angleInRadians)*secsPerFrame;
	nextY = (-1.0) * velocidad * sin(angleInRadians)*secsPerFrame;

	parcel.posX += nextX;
	parcel.posY += nextY;

	timer.start();
}

Asteroide::~Asteroide() {
	SDL_FreeSurface(surfaceReference);
}

